package com.gskj.gulimall.seckill.schedule;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

/***
 *  测试定时任务
 *
 *  定时任务
 *      1. @EnableScheduling// 开启定时任务配置
 *      2. @Scheduled(cron = "* * * * * ?") 开启一个定时任务，并设置Cron
 *      3. 自动配置类 TaskSchedulingAutoConfiguration
 *
 *  异步定时任务(异步任务，可以标注在任何类、方法上，并不是只能标注在定时任务上)
 *      1. @EnableAsync // 开启异步定时任务
 *      2. @Async //设置定时任务异步执行
 *      3. 自动配置类 TaskExecutionAutoConfiguration
 *
 *   解决： 异步+定时任务来完成定时任务不阻塞的问题。
 */
//@Slf4j
//@EnableScheduling// 开启定时任务
//@EnableAsync // 开启异步定时任务
//@Component
public class HelloSchedule {

    /**
     *  1. 在Spring中只允许 6为， 不允许第7为年
     *  2. 在周几的位置， 1-7 是从周一到周日， MON-SUN
     *  3. 定时任务不应该阻塞； 默认是阻塞的
     *      3.1 在业务层运行以异步方式执行，自己提交到线程池
     *          CompletableFuture.runAsync(()->{
     *             xxxService.hello("sss");
     *         },executor);
     *      3.2 Spring支持定时任务线程池
     *      通过设置TaskSchedulingProperties属性，修改线程池大小。不好使用。
     *
     *      3.3 让定时任务异步执行
     */
//    @Async //设置定时任务异步执行
//    @Scheduled(cron = "* * * ? * 6")
    public void hello() throws InterruptedException {
//        log.info("hello schedule...");

        Thread.sleep(3000);
//        CompletableFuture.runAsync(()->{
//            xxxService.hello("sss");
//        },executor);
    }
}
